package models;

import javax.persistence.Column;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;

import org.codehaus.jackson.annotate.JsonIgnore;

import enums.CategoriaIndicador;
import services.DAO;

@javax.persistence.Entity
@Table(name = "indicador")
@IdClass(IndicadorId.class)
public class Indicador extends models.Entity<IndicadorId> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@Column(name = "id_materia")
	private Long idMateria;
	@Id
	@Column(name = "id_grado")
	private Long idGrado;
	@Id
	@Column(name = "id_periodo")
	private Long idPeriodo;
	@Id
	@Column(name = "categoria")
	@Enumerated(EnumType.STRING)
	private CategoriaIndicador categoria;
	@Id
	@Column(name = "consecutivo")
	private Integer consecutivo;
	@Column
	private String descripcion;

	public Indicador() {
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public Integer getConsecutivo() {
		return consecutivo;
	}

	public void setConsecutivo(Integer consecutivo) {
		this.consecutivo = consecutivo;
	}

	public Long getIdGrado() {
		return idGrado;
	}

	public void setIdGrado(Long idGrado) {
		this.idGrado = idGrado;
	}

	public Long getIdMateria() {
		return idMateria;
	}

	public void setIdMateria(Long idMateria) {
		this.idMateria = idMateria;
	}

	public Long getIdPeriodo() {
		return idPeriodo;
	}

	public void setIdPeriodo(Long idPeriodo) {
		this.idPeriodo = idPeriodo;
	}

	public CategoriaIndicador getCategoria() {
		return categoria;
	}

	public void setCategoria(CategoriaIndicador categoria) {
		this.categoria = categoria;
	}

	public void generateConsecutivo() {
		Number n = DAO.executeNative("select min(i0.consecutivo)+1 from ("
				+ "select * from indicador union "
				+ "select '',?idMateria,?idGrado,?idPeriodo,?categoria,0 "
				+ ") i0 "
				+ "left join indicador i1 on i0.consecutivo+1=i1.consecutivo "
				+ "and i0.id_materia=i1.id_materia "
				+ "and i0.id_grado=i1.id_grado "
				+ "and i0.id_periodo=i1.id_periodo "
				+ "and i0.categoria=i1.categoria "
				+ "where i0.id_materia=?idMateria "
				+ "and i0.id_grado=?idGrado " + "and i0.id_periodo=?idPeriodo "
				+ "and i0.categoria=?categoria " + "and i1.id_materia is null",
				1, "idMateria", idMateria, "idGrado", idGrado, "idPeriodo",
				idPeriodo, "categoria", categoria.name());

		if (n == null)
			setConsecutivo(1);
		else {
			setConsecutivo(n.intValue());
		}

	}

	@JsonIgnore
	@Override
	public IndicadorId getId() {

		return new IndicadorId(idMateria, idGrado, idPeriodo, categoria,
				consecutivo);
	}

	@Override
	public void setId(IndicadorId id) {
		idMateria = id.getIdMateria();
		idGrado = id.getIdGrado();
		idPeriodo = id.getIdPeriodo();
		categoria = id.getCategoria();
		consecutivo = id.getConsecutivo();
	}
}
